package com.cloudfun.campusshare.util;


import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import java.util.*;

public class JsonUtil {

    public static void main(String[]args){

        String result =  "{\"cautionListInfo\":[],\"retCode\":\"00000\",\"retInfo\":\"成功\"}";

        Map res = GetJsonMap(result);

        System.out.println(res);

        System.out.println(res.get("retCode"));

        System.out.println(res.get("value"));

//        iteraJsonOrArray(result,res);

//        Set keySet = res.keySet();
//        Iterator iterator = keySet.iterator();
//        while(iterator.hasNext()){
//            String key = iterator.next().toString();
//            Object val = res.get(key);
//            System.out.println(key+":"+val.toString());
//        }
    }

    //递归遍历解析方法
    public static boolean iteraJson(String str,Map res){
        //因为json串中不一定有逗号，但是一定有：号，所以这里判断没有则已经value了
        if(str.toString().indexOf(":") == -1){
            return true;
        }
        JSONObject fromObject = JSONObject.fromObject(str);
        Iterator keys = fromObject.keys();
        while(keys.hasNext()){
            String key = keys.next().toString();
            Object value = fromObject.get(key);
            if(iteraJson(value.toString(),res)){
                res.put(key, value);
            }
        }
        return false;
    }

    //递归遍历解析方法
    public static boolean iteraJsonOrArray(String source,Map map){
        if(source.indexOf(":") == -1){
            return true;
        }
        JSONObject fromObject = JSONObject.fromObject(source);
        Iterator keys = fromObject.keys();
        while(keys.hasNext()){
            String key = keys.next().toString();
            Object value = fromObject.get(key);
            String val = value.toString();
            if(val.indexOf("[{") == -1){
                //说明不存在数组json即格式为："[{" 开头的数据。可以允许是[10,11,12]的非json数组
                if (val.indexOf(":") == -1  || val.matches("[\\d]{4}-[\\d]{2}-[\\d]{2}\\s[\\d]{2}:[\\d]{2}:[\\d]{2}")){
                    //当字符串中不存在：说明已经是值了，如果存在：也可能是日期类型的数据，所以用正则表达式匹配，如果是日期，就直接放入Map中
                    map.put(key, val);
                }else{
                    iteraJson(val,map);
                }
            }else if(val.indexOf("[{") != -1){
                //说明存在数组json即格式为：[{开头的json数组
                if(val.indexOf("[{") == 0){
                    //说明当前value就是一个json数组
                    //去除[括号
                    String jsons = val.substring(1, val.lastIndexOf("]"));//得到数据格式为：{...},{...},{...}
                    //把上面得到jsons分割成数组
                    //因为数据格式为{name:joker,age:20},{...},{...}，所以不能用逗号分割。否则会变"{name:joker" "age:20}"
                    //使用正则表达式把},{替换成}|{
                    jsons = jsons.replaceAll("\\}\\s?,\\s?\\{", "}|{");
                    String[] split = jsons.split("\\|");
                    for(int i = 0; i < split.length;i++){
                        iteraJsonOrArray(split[i],map);//符合当前递归条件
                    }

                }else{
                    //说明value可能是一个json，这个json中任然包含数组。例如：{inner:[{a:1,b:2,c:3}]}
                    iteraJsonOrArray(val,map);//符合当前递归条件
                }
            }

        }

        return false;
    }

    /**
     * 将json转化为map
     * @param resource
     * @return
     */
    public static Map GetJsonMap(String resource){

        JSONObject jsonObject = JSONObject.fromObject(resource);

        Map map = new HashMap();

        ParseJson(jsonObject, map);

        return map;

    }

    public static void ParseJson(Object objJson, Map map){

        //如果obj为json数组
        if(objJson instanceof JSONArray){
            JSONArray objArray = (JSONArray)objJson;
            for (int i = 0; i < objArray.size(); i++) {
                ParseJson(objArray.get(i), map);
            }
        }
        //如果为json对象
        else if(objJson instanceof JSONObject){
            JSONObject jsonObject = (JSONObject)objJson;
            Iterator it = jsonObject.keys();
            while(it.hasNext()){
                String key = it.next().toString();
                Object object = jsonObject.get(key);
                //如果得到的是数组
                if(object instanceof JSONArray){
                    JSONArray objArray = (JSONArray)object;
                    ParseJson(objArray, map);
                }
                //如果key中是一个json对象
                else if(object instanceof JSONObject){
                    ParseJson((JSONObject)object, map);
                }
                //如果key中是其他
                else{
                    map.put(key,object.toString());
//                    System.out.println("["+key+"]:"+object.toString()+" ");
                }
            }
        }
    }

}
